package com.own.business.message.center.business.service;

import com.own.business.message.center.entity.bo.MessageCenterContentBo;
import com.own.business.message.center.entity.map.MessageCenterContentMapVo;
import com.own.business.message.center.entity.po.MessageCenterContent;
import com.own.business.message.center.entity.query.MessageCenterContentQuery;
import com.own.business.message.center.entity.vo.MessageCenterContentVo;
import com.own.component.common.base.service.BaseService;
import com.own.component.common.model.PageModel;

import java.util.Map;

/**
 * MessageCenterContentService
 *
 * @author chenxueli
 * @date 2023-11-13 14:39:27
 */
public interface MessageCenterContentService extends BaseService<
        MessageCenterContent,
        MessageCenterContentBo,
        MessageCenterContentVo,
        MessageCenterContentMapVo,
        MessageCenterContentQuery
        > {

    /**
     * 设置已读
     *
     * @param userId    用户id
     * @param messageId 消息id
     */
    void read(Long userId, Long messageId);

    /**
     * 一键已读
     *
     * @param userId 用户id
     */
    void batchRead(Long userId);

    /**
     * 一键已读
     *
     * @param userId   用户id
     * @param groupKey 分组key
     */
    void batchRead(Long userId, String groupKey);

    /**
     * 未读消息数
     *
     * @param userId 用户id
     * @return 未读消息数
     */
    Long countUnread(Long userId);

    /**
     * 分组查询未读数量（messageKey）
     *
     * @param userId 用户id
     * @return 未读数量
     */
    Map<String, Integer> mapCountUnreadByUserIdForMessageKey(Long userId);

    /**
     * 分组查询未读数量（groupKey）
     *
     * @param userId 用户id
     * @return 未读数量
     */
    Map<String, Integer> mapCountUnreadByUserIdForGroupKey(Long userId);

    /**
     * 查询最新的消息（messageKey）
     *
     * @param userId 用户id
     * @return 最新的消息
     */
    Map<String, MessageCenterContentMapVo> mapLatestMessageByUserIdForMessageKey(Long userId);

    /**
     * 查询最新的消息（groupKey）
     *
     * @param userId 用户id
     * @return 最新的消息
     */
    Map<String, MessageCenterContentMapVo> mapLatestMessageByUserIdForGroupKey(Long userId);

    /**
     * 根据时间戳查询之后的n条信息
     *
     * @param userId    用户id
     * @param timestamp 时间戳
     * @param limit     条数
     * @return 信息
     */
    PageModel<MessageCenterContentVo> next(Long userId, Long timestamp, Integer limit);

}

